package org.xpandaframework.base.curd.impl;

import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

import javax.persistence.Column;

import org.apache.commons.lang3.StringUtils;
import org.xpandaframework.base.utils.CamelCaseUtils;

/**
 * <p>
 * CopyRright (c)2008-2014: Camelot
 * <p>
 * Project: xpandaframework Maven Webapp
 * <p>
 * Module ID: <模块类编号可以引用系统设计中的类编号>
 * <p>
 * Comments: 获取数据库字段
 * <p>
 * JDK version used: JDK1.6
 * <p>
 * NameSpace: org.xpandaframework.base.curd.impl.ColumnGenerator.java
 * <p>
 * Author: Angus
 * <p>
 * Create Date: 2014-11-21
 * <p>
 * Modified By: <修改人中文名或拼音缩写>
 * <p>
 * Modified Date: <修改日期>
 * <p>
 * Why & What is modified: <修改原因描述>
 * <p>
 * Version: v1.0
 */
public class ColumnGenerator {

  /**
   * 获取泛型、泛型父类的被注解的字段
   * 
   * @param clazz 要被获取的类
   * @throws Exception
   */
  public static Map<String, String> getDBColumn(Class<?> clazz) {
    // 获取EntityClass
    final Type genType = clazz.getGenericSuperclass();
    final Type[] params = ((java.lang.reflect.ParameterizedType) genType).getActualTypeArguments();
    final Class<?> entityClass = (Class<?>) params[0];
    // 获取BaseEntityClass
    final Class<?> baseEntity = entityClass.getSuperclass();
    final Map<String, String> currentColumnFieldNames = new HashMap<String, String>();
    // 取得所有BaseEntityClass字段
    final Field[] baseFields = baseEntity.getDeclaredFields();
    String fieldName = null;
    String columnName = null;
    for (final Field field : baseFields) {
      // TODO 是否被注解的属性，如果没被注解则不处理
      // if (field.isAnnotationPresent(baseEntity)) {
      // continue;
      // }
      // 获取字段名
      fieldName = field.getName();
      // 获取被普通列注解的字段
      final Column column = field.getAnnotation(Column.class);
      if (null != column) {
        columnName = column.name();
      } else {
        columnName = null;
      }
      // 序列化字段不处理
      if (!"serialVersionUID".equals(fieldName)) {
        // 如果未标识特殊的列名，默认取字段名
        columnName = (StringUtils.isEmpty(columnName) ? StringUtils
            .upperCase(CamelCaseUtils.toUnderlineName(fieldName))
            : columnName);
        currentColumnFieldNames.put(columnName, fieldName);
      }
    }
    // 取得所有EntityClass字段
    final Field[] fields = entityClass.getDeclaredFields();
    for (final Field field : fields) {
      // TODO 是否被注解的属性，如果没被注解则不处理
      // if (field.isAnnotationPresent((Class<? extends Annotation>) entityClass)) {
      // continue;
      // }
      // 获取字段名
      fieldName = field.getName();
      // 获取被普通列注解的字段
      final Column column = field.getAnnotation(Column.class);
      if (null != column) {
        columnName = column.name();
      } else {
        columnName = null;
      }
      // 序列化字段不处理
      if (!"serialVersionUID".equals(fieldName)) {
        // 如果未标识特殊的列名，默认取字段名
        columnName = (StringUtils.isEmpty(columnName) ? StringUtils
            .upperCase(CamelCaseUtils.toUnderlineName(fieldName))
            : columnName);
        currentColumnFieldNames.put(columnName, fieldName);
      }
    }
    return currentColumnFieldNames;
  }
}
